package base.thread_JUC.demo02;

import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * ArrayList线程不安全的解决方案：
 *  1、使用Vector代替 （不推荐）
 *  2、使用工具类变成安全的：Collections.synchronizedList(new ArrayList())
 *  3、使用写时复制：CopyOnWriteArrayList
 *  通过每往List增加一个元素，复制整个数组（新数组长度+1），且内存对其它线程是可见的。代价比较大,但是在多线程下是安全的.
 */
public class Client {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> arrayList = new CopyOnWriteArrayList<>();

        /**MYWHAT transient 关键字作用？
         * transient ReentrantLock lock = new ReentrantLock();
         * 我们都知道一个类只要实现了Serilizable接口，这个类的对象就可以被序列化，这个类的所有属性和方法都会自动序列化。
         *然而在实际开发过程中，我们常常会遇到这样的问题，这个类的有些属性需要序列化，而其他属性不需要被序列化，打个比方，
         * 如果一个用户有一些敏感信息（如密码，银行卡号等），为了安全起见，不希望在网络操作（主要涉及到序列化操作，本地序列化缓存也适用）中被传输，
         * 这些信息对应的变量就可以加上transient关键字。换句话说，这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
         */
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                arrayList.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(arrayList);
            }, String.valueOf(i)).start();
        }
    }
}



